package com.douxg.fastCoding.web.vo;

import lombok.Data;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;

/**
 * @Description 饿了么前端下拉组件对应vo
 * @Auther douxg
 * @Date 2020/7/30 10:26
 */
@Data
@Accessors(chain = true)
@Slf4j
public class ElSelectVo {
    private String label;
    private String value;
    private List<ElSelectVo> children;

    public static ElSelectVo createByValue(String value) {
        return createByValueAndLabel(value, value);
    }

    public static ElSelectVo createByValueAndLabel(String value, String label) {
        return new ElSelectVo().setLabel(label).setValue(value);
    }

    public static List<ElSelectVo> createListByValue(List<String> values) {
        List<ElSelectVo> list = new ArrayList<>();
        for (String value : values) {
            list.add(createByValue(value));
        }
        return list;
    }

    public static List<ElSelectVo> createListByEntity(List datas, String kStr, String vStr) {
        List<ElSelectVo> list = new ArrayList<>();
        for (Object data : datas) {
            if (data instanceof Map) {
                Map map = (Map) data;
                list.add(createByValueAndLabel(map.get(vStr).toString(), map.get(kStr).toString()));
            } else {
                Class<?> aClass = data.getClass();
                try {
                    String key = Optional.ofNullable(aClass.getDeclaredField(kStr)).map(field -> {
                        field.setAccessible(true);
                        try {
                            return field.get(data);
                        } catch (IllegalAccessException e) {
                            log.error("获取属性报错", e);
                            return null;
                        }
                    }).map(o -> o.toString()).orElse("");
                    String val = Optional.ofNullable(aClass.getDeclaredField(vStr)).map(field -> {
                        field.setAccessible(true);
                        try {
                            return field.get(data);
                        } catch (IllegalAccessException e) {
                            log.error("获取属性报错", e);
                            return null;
                        }
                    }).map(o -> o.toString()).orElse("");
                    list.add(createByValueAndLabel(val, key));
                } catch (Exception e) {
                    log.error("获取属性报错", e);
                }
            }
        }
        return list;
    }
}
